﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using GigaSite.Domain.Entities;
using GigaSite.Domain.Enums;
using GigaSite.Domain.Interfaces.Repositories;
using GigaSite.Domain.IoC;
using GigaSite.Web.Areas.ControlPanel.Models;

namespace GigaSite.Web.Areas.ControlPanel.Controllers
{
    /// <summary>
    /// Контроллер для управления содержимым, отображаемым на главной странице сайта
    /// </summary>
    public class ManageHomePageController : BaseRootController
    {
        //
        // GET: /ControlPanel/ManageHomePage/
        /// <summary>
        /// Отображает панель управления содержимым, выводимым на главной странице
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            return View();
        }

        /// <summary>
        /// Обрабатывает клиентский запрос на загрузку баннеров размещенных на главной странице
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public JsonResult GetBanners()
        {
            try
            {
                // Репозиторий
                var repository = Locator.GetService<IHomePageRepository>();

                // Баннеры
                var banners = repository.GetHomePageBanners().OrderBy(b => b.Sequence).Select(b => new HomePageBanner(b));

                // Отдаем результат
                return JsonSuccess(banners);
            }
            catch (Exception e)
            {
                return JsonErrors(e);
            }
        }

        /// <summary>
        /// Обрабатывает запрос на сохранение баннера на главную, при наличии файла - файл сохраняется в системе хранения файлов
        /// </summary>
        /// <param name="id">Идентификатор баннера</param>
        /// <param name="title">заголовок баннера</param>
        /// <param name="url">URL на который он ведет</param>
        /// <param name="photoURL">URL изображения</param>
        /// <param name="region">Регион в который поместить баннер</param>
        /// <param name="sequence">Порядковый номер для сортировки</param>
        /// <param name="bannerHidden">Баннер скрыт</param>
        /// <returns>Сообщение об успешной загрузке или незагрузке баннера</returns>
        [HttpPost]
        public JsonResult SaveBanner(long id, string title, string url, string photoURL, string region, int sequence, string bannerHidden)
        {
            try
            {
                // Репозитории
                var homepageRepository = Locator.GetService<IHomePageRepository>();
                var imagesRepository = Locator.GetService<IImagesRepository>();

                // Проверяем прислан ли нам файл
                bool fileSubmitted = false;
                string submittedFileURL = String.Empty;
                if (Request.Files["bannerImage"] != null && Request.Files["bannerImage"].ContentLength > 0)
                {
                    // Файл прислан, сохраняем его в файловой системе
                    fileSubmitted = true;
                    var submittedImage = imagesRepository.SavePostedFile(Request.Files["bannerImage"]);
                    submittedFileURL = submittedImage.URI;
                }

                // Обрабатываем отправленное значение скрытости или открыто
                var hidden = bannerHidden == "on" | bannerHidden == "true";

                // сохраняем непосредственно информацию об объекте
                if (id < 0)
                {
                    // Создаем новый объект
                    var newElement = new HomePageElement()
                                         {
                                             DateCreated = DateTime.Now,
                                             Description = String.Empty,
                                             ElementType = HomePageElementTypes.ImageBanner,
                                             Hidden = hidden,
                                             URL = url,
                                             Region = region,
                                             Sequence = sequence,
                                             Title = title,
                                             ImageURL = fileSubmitted ? submittedFileURL : photoURL
                                         };
                    homepageRepository.Add(newElement);
                }
                else
                {
                    // Редактируем объект баннера
                    var banner = homepageRepository.Load(id);
                    if (banner == null)
                    {
                        throw new ObjectNotFoundException(string.Format("Элемент главной страницы с идентификатором {0} не найден", id));
                    }

                    banner.DateModified = DateTime.Now;
                    banner.ElementType = HomePageElementTypes.ImageBanner;
                    banner.Title = title;
                    banner.Hidden = hidden;
                    banner.URL = url;
                    banner.Region = region;
                    banner.Sequence = sequence;
                    banner.ImageURL = fileSubmitted ? submittedFileURL : photoURL;
                }

                // Сохраняем любимые изменения
                homepageRepository.SubmitChanges();

                // Отдаем информацию о том что у нас все хорошо
                return Json(new {success = true, msg = "ok"});
            }
            catch (Exception e)
            {
                Response.StatusCode = 500;
                return Json(new {success = false, msg = e.Message});
            }
        }

        /// <summary>
        /// Удаляет элемент главной страницы с указанным идентификатором
        /// </summary>
        /// <param name="id">Идентификатор элемента</param>
        /// <returns>Сообщение об удаче или неудаче</returns>
        [HttpPost]
        public JsonResult DeleteElement(long id)
        {
            try
            {
                // репозиторий
                var repository = Locator.GetService<IHomePageRepository>();

                // Загружаем элемент
                var element = repository.Load(id);
                if (element == null)
                {
                    throw new ObjectNotFoundException(String.Format("Элемент главной страницы с идентификатором {0} не найден",id));
                }

                // Удаляем
                repository.Delete(element);
                repository.SubmitChanges();

                // Отправляем результат
                return JsonSuccess();
            }
            catch (Exception e)
            {
                return JsonErrors(e);
            }
        }

    }
}
